package com.atguigu.day14.exception.e3;

import org.junit.Test;

/*
异常: 程序执行时发生的错误情况 导致程序无法继续执行
异常的体系:
    Throwable
       -- Error: 错误 我们不能处理 只能提前避免
       -- Exception: 异常 可以处理的
            -- 运行时异常: 程序执行起来才报错
            -- 编译时/检查/受检异常: 写完代码就报错
    a.getMessage():发生异常的原因
    a.printStackTrace();打印异常的详细信息 异常的类型 原因 发生的位置
异常的抛出机制:
    自动抛出: 发生异常会产生一个异常对象 是否对异常进行了处理 如果本方法没有处理 那么就会沿着调用关系逐级向上抛出
            直到抛给jvm  终止程序 打印异常的类型  发生异常的原因  异常的抛出轨迹
    手动抛出: 如果数据不满足要求 可以手动抛出
            throw 一个异常对象;
异常的处理:
    处理: try{可能发生异常的代码}catch(异常类型 e){}
    注意:
       1.只能捕获声明的异常
       2.可以一次捕获多个异常 多重catch  异常范围从小到大
         可以在一个catc内写多个异常类型           try{}catch (ArrayIndexOutOfBoundsException |ArithmeticException | NullPointerException  e){}
       3.try{}中声明的变量只能在try语句块内使用 别的位置想要用需要进行作用域提升
       4.finally 无论如何都要执行某段代码
           try{}finally{}
           try{}catch(){}finally{}
       5.如果非要不让 finally{}  System.exit(0) 退出jvm


    不处理:
 */
public class FinallyTest {

    @Test
    public void test03() {
        int num = getNum();
        System.out.println("num = " + num);
    }
    private int getNum() {
        int num = 10;
        try {
            num = 33;
            int m = 10/0;
            return num;
        } catch (Exception e) {
            num = 66;
            return num;//底层有临时变量 记录要返回的值
        } finally {
            num = 99;
        //    return num;
        }
    }

    @Test
    public void test02() {

        System.out.println("两处相思同淋雪");
        String[] arr = {"杨幂", "赵丽颖"};
        try {
            System.out.println("此生也算共白头");
            //return;
            System.exit(0);
        } catch (ArrayIndexOutOfBoundsException e) {
            e.printStackTrace();
        } finally {
            System.out.println("GameOver");
        }

    }

    @Test
    public void test01() {

        System.out.println("两处相思同淋雪");
        String[] arr = {"杨幂", "赵丽颖"};
        try {
            int m = 10 / 0;
            System.out.println("arr[10] = " + arr[10]);
            System.out.println("此生也算共白头");
        } catch (ArrayIndexOutOfBoundsException e) {
            e.printStackTrace();
        } finally {
            System.out.println("GameOver");
        }

    }
}
